基本的单例模式实现方式


public class Singleton {
    
    private Singleton () {
        System.out.println("Singleton is created");
    }
    
    private static Singleton instance = new Singleton();
    
    public static Singleton getInstance () {
        return instance;
    }
    
}

但是不足之处是,Singleton的创建时间不受控制。对于静态成员instance, 它会在类第一次初始化的时候被创建,但这个时刻并不一定是getInstance()方法第一次被调用的时候。例如:


public class Singleton {

    public static int STATUS = 1;
    
    private Singleton () {
        System.out.println("Singleton is created");
    }
    
    private static Singleton instance = new Singleton();
    
    public static Singleton getInstance () {
        return instance;
    }
    
}

注意这里的单例包含一个静态成员STATUS, 此时在任意地方引用这个STATUS都会导致Singleton这个类被初始化,并创建instance实例。

延迟加载的单例模式实现方式


public class LazySingleton {
    
    private LazySingleton() {
        System.out.println("Singleton is created");
    }
    
    private static LazySingleton instance = null;
    
    public static synchronized LazySingleton getInstance() {
        if (instance == null)
            instance = new LazySingleton();
        return instance;
    }

}

这样在调用getInstance()方法的时候才会创建单例对象。但是坏处是在并发环境下加锁,会对性能产生影响。

结合两种单例模式的实现方式


public class StaticSingleton {

    private StaticSingleton() {
        System.out.println("Singleton is created");
    }
    
    private static class SingletonHolder {
        private static StaticSingleton instance = new StaticSingleton();
    }
    
    public static StaticSingleton getInstance() {
        return SingletonHolder.instance;
    }
    
}

这种方式没有加锁,在并发模式下性能优越,而且只有在getInstance()方法被第一次调用时,StaticSingleton实例才会被创建。

《Java高并发程序设计》第5章 · 并行模式与算法


nasuf
557 声望21 粉丝